package ace.module.oauth2.server.sdk.core.service;

import ace.cmp.core.model.R;
import ace.module.oauth2.server.api.model.dto.ext.Oauth2AccessTokenDto;
import ace.module.oauth2.server.api.model.input.Oauth2GetTokenByExternalUserInput;
import jakarta.annotation.Nullable;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;

/**
 * @author caspar
 * @date 2023/3/3 13:34 辅助调整oauth2 auth api
 */
public interface Oauth2AuthApiService {

  /**
   * 获取token,使用 oauth2 external_user 认证流程
   *
   * @return
   */
  R<Oauth2AccessTokenDto> getTokenByExternalUserGrantType(@Valid @NotNull Oauth2GetTokenByExternalUserInput input);

  /**
   * 获取token,使用 oauth2 rest 认证流程 账户名与密码认证方法.
   *
   * @param authorization 客户端认证授权 header basic or none or oauth2 协议支持的认证授权
   * @param username 账户名
   * @param password 密码
   * @param captchaItemId 验证码id
   * @param code 验证码 可选 根据认证应用配置进行
   * @return token
   */
  R<Oauth2AccessTokenDto> getTokenByRestGrantTypeAndPasswordMethod(
      @Valid @NotEmpty String authorization,
      @Valid @NotEmpty String username,
      @Valid @NotEmpty String password,
      @Nullable Long captchaItemId,
      @Nullable String code);
}
